
/**************************************************START OF FILE*****************************************************/





/*------------------------------------------------------------------------------------------------------------------
Includes
*/
#include "xBSP_Spi.h"



/*------------------------------------------------------------------------------------------------------------------
Macros
*/


/*------------------------------------------------------------------------------------------------------------------
Variables
*/
SPI_HandleTypeDef SPI3_Handler;  //SPI3句柄




/*
********************************************************************************************************************
@ Brief  : spi io init

@ Param  : NONE

@ Return : NONE

@ Author : lyc

@  Date  : 2020 - 04 - 02
********************************************************************************************************************
*/
void xBSP_Spi_init(void)
{
    GPIO_InitTypeDef GPIO_Initure;
    
    __HAL_RCC_GPIOB_CLK_ENABLE();       //使能GPIOB时钟
    __HAL_RCC_SPI3_CLK_ENABLE();        //使能SPI3时钟

    //PB3.5
    GPIO_Initure.Pin=GPIO_PIN_3|GPIO_PIN_5;
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;              //复用推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;   //80Mhz           
    GPIO_Initure.Alternate=GPIO_AF6_SPI3;           //PB3.5复用为SPI3
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);

    SPI3_Handler.Instance=SPI3;                         //SPI3
    SPI3_Handler.Init.Mode=SPI_MODE_MASTER;             //设置SPI工作模式，设置为主模式
    SPI3_Handler.Init.Direction=SPI_DIRECTION_2LINES;   //设置SPI单向或者双向的数据模式:SPI设置为双线模式
    SPI3_Handler.Init.DataSize=SPI_DATASIZE_8BIT;       //设置SPI的数据大小:SPI发送接收8位帧结构
    SPI3_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH;    //串行同步时钟的空闲状态为高电平
    SPI3_Handler.Init.CLKPhase=SPI_PHASE_2EDGE;         //串行同步时钟的第二个跳变沿（上升或下降）数据被采样
    SPI3_Handler.Init.NSS=SPI_NSS_SOFT;                 //NSS信号由硬件（NSS管脚）还是软件（使用SSI位）管理:内部NSS信号有SSI位控制
    SPI3_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2;//定义波特率预分频的值:波特率预分频值为256
    SPI3_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
    SPI3_Handler.Init.TIMode=SPI_TIMODE_DISABLE;        //关闭TI模式
    SPI3_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验
    SPI3_Handler.Init.CRCPolynomial=7;                  //CRC值计算的多项式
    HAL_SPI_Init(&SPI3_Handler);						//初始化SPI3
    
    __HAL_SPI_ENABLE(&SPI3_Handler);                    //使能SPI3    
}

uint8_t SPI3_ReadWriteByte(uint8_t txData)
{
    uint8_t rxdata;
    HAL_SPI_TransmitReceive(&SPI3_Handler,&txData,&rxdata,1, 1000);
 	return rxdata;
}

uint8_t SPI3_WriteByte(uint8_t *txData,uint16_t size)
{
	return HAL_SPI_Transmit(&SPI3_Handler,txData,size,1000);
}
/****************************************************END OF FILE*****************************************************/
